2011/12/15


こうですか?わかりません
@hasegawayosuke

ExecuteExcel4Macro で CALL ワークシート関数使ってShellExecute呼んでそれでVimScript操作してHTMLを数秒で生成する Excel の使い方をたぶん mattn が書いてくれる。


http://twitter.com/hasegawayosuke/statuses/147123761429217280

まずGo言語のソース(動作には go-oleが必要) package main

import (
    "fmt"
    "github.com/mattn/go-ole"
    "github.com/mattn/go-ole/oleutil"
    "io/ioutil"
    "os"
    "path/filepath"
    "strconv"
)

func main() {
    ole.CoInitialize(0)

    unknown, _ := oleutil.CreateObject("Excel.Application")
    excel, _ := unknown.QueryInterface(ole.IID_IDispatch)
    defer func() {
        if excel != nil {
            oleutil.CallMethod(excel, "Quit")
            excel.Release()
        }
    }()

    path, _ := filepath.Abs(os.Args[1])
    sheet := os.Args[2]
    r1, _ := strconv.Atoi(os.Args[3])
    c1, _ := strconv.Atoi(os.Args[4])
    r2, _ := strconv.Atoi(os.Args[5])
    c2, _ := strconv.Atoi(os.Args[6])

    dir, file := filepath.Split(path)

    path = fmt.Sprintf(`'%s[%s]%s'`, dir, file, sheet)

    cwd, _ := os.Getwd()
    tmp, _ := ioutil.TempFile(cwd, "hasegawayosuke")
    defer os.Remove(tmp.Name())

    for r := r1; r <= r2; r++ {
        for c := c1; c <= c2; c++ {
            ret := oleutil.MustCallMethod(
                excel,
                "ExecuteExcel4Macro",
                fmt.Sprintf(`""&` + path + `!R%dC%d`, r, c))
            if c != c1 {
                fmt.Fprint(tmp, ",")
            }
            fmt.Fprint(tmp, ret.ToString())
        }
        fmt.Fprintln(tmp)
    }

    oleutil.MustCallMethod(
        excel,
        "ExecuteExcel4Macro",
        `CALL("shell32", "ShellExecuteA", "JJJCCJJ", 0, 0, "gvim", ` +
            `"""` + tmp.Name() + `"" -S session.vim", 0, 1)`)
}
そしてセッション用のvimscript %s!,!</td><td>!g|:%s!.*!<tr>\r\t<td>&</td>\r</tr>!g|:%s!><!>\r\t<!g
exe "normal! ggO<table>\<esc>Go</table>"
set ft=html
コマンドラインから excel4macro subtech.xls Sheet1 3 2 7 3  
こう実行する。引数はファイル名、シート名、開始行番号、開始列番号、終了行番号、終了列番号になります。
これで実行すると...

excel4macro
便利!ぇ
Posted at by